Add WPTs for testing the effect on activeElement of the containing doc when calling .focus() and .blur() on an OOP iframe. Differential Revision: https://phabricator.services.mozilla.com/D81497 bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1649099 gecko-commit: 05cc29ef24ba11b59afb8954ef23d243f05b2bfd gecko-reviewers: jgraham 
diff --git a/focus/activeelement-after-focusing-different-site-iframe-contentwindow.html b/focus/activeelement-after-focusing-different-site-iframe-contentwindow.html new file mode 100644 index 0000000..b16280a --- /dev/null +++ b/focus/activeelement-after-focusing-different-site-iframe-contentwindow.html 
@@ -0,0 +1,36 @@ +<!doctype html> +<meta charset=utf-8> +<title>activeElement when focusing different-site iframe's contentWindow</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +setup({explicit_done:true}); +window.onmessage = function(e) { + var actual = e.data; + test(function() { + // Handle trailing events separately to get make it easier to see + // if they are the only deviation from the expection. + var endedWith = false; + if (actual.endsWith(",willspineventloop,")) { + endedWith = true; + actual += "innerbodyfocus,"; + } + assert_false(endedWith, "Should have gotten innerbodyfocus after willspineventloop"); + }, "Check trailing events"); + test(function() { + // This is a Fission oddity + var endedWith = false; + if (actual.endsWith(",willspineventloop,innerbodyfocus,")) { + endedWith = true; + actual += "innerbodyblur,innerbodyfocus,"; + } + assert_true(endedWith, "Should have gotten innerbodyfocus after willspineventloop"); + }, "Check more trailing events"); + test(function() { + assert_equals(actual, "outeronload,activeElement:BODY,willfocusiframe,didfocusiframe,activeElement:IFRAME,willbluriframe,didbluriframe,activeElement:IFRAME,willspineventloop,innerbodyfocus,innerbodyblur,innerbodyfocus,", 'Check log'); + }, "Check result"); + w.close(); + done(); +}; +var w = window.open("support/activeelement-after-focusing-different-site-iframe-outer-contentwindow.sub.html"); +</script> 
diff --git a/focus/activeelement-after-focusing-different-site-iframe.html b/focus/activeelement-after-focusing-different-site-iframe.html new file mode 100644 index 0000000..b974252 --- /dev/null +++ b/focus/activeelement-after-focusing-different-site-iframe.html 
@@ -0,0 +1,27 @@ +<!doctype html> +<meta charset=utf-8> +<title>activeElement when focusing different-site iframe</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +setup({explicit_done:true}); +window.onmessage = function(e) { + var actual = e.data; + test(function() { + // Handle trailing events separately to get make it easier to see + // if they are the only deviation from the expection. + var endedWith = false; + if (actual.endsWith(",willspineventloop,")) { + endedWith = true; + actual += "innerbodyfocus,innerbodyblur,"; + } + assert_false(endedWith, "Should have gotten innerbodyfocus,innerbodyblur after willspineventloop"); + }, "Check trailing events"); + test(function() { + assert_equals(actual, "outeronload,activeElement:BODY,willfocusiframe,didfocusiframe,activeElement:IFRAME,willbluriframe,didbluriframe,activeElement:BODY,willspineventloop,innerbodyfocus,innerbodyblur,", 'Check log'); + }, "Check result"); + w.close(); + done(); +}; +var w = window.open("support/activeelement-after-focusing-different-site-iframe-outer.sub.html"); +</script> 
diff --git a/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html b/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html new file mode 100644 index 0000000..b4a14e7 --- /dev/null +++ b/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html 
@@ -0,0 +1,27 @@ +<!doctype html> +<meta charset=utf-8> +<title>activeElement when focusing same-site iframe's contentWindow</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +setup({explicit_done:true}); +window.onmessage = function(e) { + var actual = e.data; + test(function() { + // Handle trailing events separately to get make it easier to see + // if they are the only deviation from the expection. + var endedWith = false; + if (actual.endsWith(",willspineventloop,")) { + endedWith = true; + actual += "innerbodyfocus,"; + } + assert_false(endedWith, "Should have gotten innerbodyfocus after willspineventloop"); + }, "Check trailing events"); + test(function() { + assert_equals(actual, "outeronload,activeElement:BODY,willfocusiframe,didfocusiframe,activeElement:IFRAME,willbluriframe,didbluriframe,activeElement:IFRAME,willspineventloop,innerbodyfocus,", 'Check log'); + }, "Check result"); + w.close(); + done(); +}; +var w = window.open("support/activeelement-after-focusing-same-site-iframe-outer-contentwindow.html"); +</script> 
diff --git a/focus/activeelement-after-focusing-same-site-iframe.html b/focus/activeelement-after-focusing-same-site-iframe.html new file mode 100644 index 0000000..55918eb --- /dev/null +++ b/focus/activeelement-after-focusing-same-site-iframe.html 
@@ -0,0 +1,27 @@ +<!doctype html> +<meta charset=utf-8> +<title>activeElement when focusing same-site iframe</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +setup({explicit_done:true}); +window.onmessage = function(e) { + var actual = e.data; + test(function() { + // Handle trailing events separately to get make it easier to see + // if they are the only deviation from the expection. + var endedWith = false; + if (actual.endsWith(",willspineventloop,")) { + endedWith = true; + actual += "innerbodyfocus,innerbodyblur,"; + } + assert_false(endedWith, "Should have gotten innerbodyfocus,innerbodyblur after willspineventloop"); + }, "Check trailing events"); + test(function() { + assert_equals(actual, "outeronload,activeElement:BODY,willfocusiframe,didfocusiframe,activeElement:IFRAME,willbluriframe,didbluriframe,activeElement:BODY,willspineventloop,innerbodyfocus,innerbodyblur,", 'Check log'); + }, "Check result"); + w.close(); + done(); +}; +var w = window.open("support/activeelement-after-focusing-same-site-iframe-outer.html"); +</script> 
diff --git a/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html b/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html new file mode 100644 index 0000000..4cb3c68 --- /dev/null +++ b/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html 
@@ -0,0 +1,27 @@ +<!doctype html> +<meta charset=utf-8> +<title>activeElement when immediately focusing different-site iframe's contentWindow</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +setup({explicit_done:true}); +window.onmessage = function(e) { + var actual = e.data; + test(function() { + // Make the difference between Firefox and Chrome visible separately + // from the comparison of the entire log string failing to match. + var endedWith = false; + if (actual.endsWith(",willspineventloop,")) { + endedWith = true; + actual += "innerbodyfocus,"; + } + assert_true(endedWith, "Should not have gotten innerbodyfocus after willspineventloop"); + }, "Check trailing events"); + test(function() { + assert_equals(actual, "outerparser,activeElement:BODY,willfocusiframe,didfocusiframe,activeElement:IFRAME,willbluriframe,didbluriframe,activeElement:IFRAME,willspineventloop,innerbodyfocus,", 'Check log'); + }, "Check result"); + w.close(); + done(); +}; +var w = window.open("support/activeelement-after-immediately-focusing-different-site-iframe-outer-contentwindow.sub.html"); +</script> 
diff --git a/focus/activeelement-after-immediately-focusing-different-site-iframe.html b/focus/activeelement-after-immediately-focusing-different-site-iframe.html new file mode 100644 index 0000000..67bf733 --- /dev/null +++ b/focus/activeelement-after-immediately-focusing-different-site-iframe.html 
@@ -0,0 +1,16 @@ +<!doctype html> +<meta charset=utf-8> +<title>activeElement when immediately focusing different-site iframe</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +setup({explicit_done:true}); +window.onmessage = function(e) { + test(function() { + assert_equals(e.data, "outerparser,activeElement:BODY,willfocusiframe,didfocusiframe,activeElement:IFRAME,willbluriframe,didbluriframe,activeElement:BODY,willspineventloop,", 'Check log'); + }, "Check result"); + w.close(); + done(); +}; +var w = window.open("support/activeelement-after-immediately-focusing-different-site-iframe-outer.sub.html"); +</script> 
diff --git a/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html b/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html new file mode 100644 index 0000000..81dbfd2 --- /dev/null +++ b/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html 
@@ -0,0 +1,27 @@ +<!doctype html> +<meta charset=utf-8> +<title>activeElement when immediately focusing same-site iframe's contentWindow</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +setup({explicit_done:true}); +window.onmessage = function(e) { + var actual = e.data; + test(function() { + // Make the difference between Firefox and Chrome visible separately + // from the comparison of the entire log string failing to match. + var endedWith = false; + if (actual.endsWith(",willspineventloop,")) { + endedWith = true; + actual += "innerbodyfocus,"; + } + assert_true(endedWith, "Should not have gotten innerbodyfocus after willspineventloop"); + }, "Check trailing events"); + test(function() { + assert_equals(actual, "outerparse,activeElement:BODY,willfocusiframe,didfocusiframe,activeElement:IFRAME,willbluriframe,didbluriframe,activeElement:IFRAME,willspineventloop,innerbodyfocus,", 'Check log'); + }, "Check result"); + w.close(); + done(); +}; +var w = window.open("support/activeelement-after-immediately-focusing-same-site-iframe-outer-contentwindow.html"); +</script> 
diff --git a/focus/activeelement-after-immediately-focusing-same-site-iframe.html b/focus/activeelement-after-immediately-focusing-same-site-iframe.html new file mode 100644 index 0000000..a035af0 --- /dev/null +++ b/focus/activeelement-after-immediately-focusing-same-site-iframe.html 
@@ -0,0 +1,16 @@ +<!doctype html> +<meta charset=utf-8> +<title>activeElement when immediately focusing same-site iframe</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +setup({explicit_done:true}); +window.onmessage = function(e) { + test(function() { + assert_equals(e.data, "outerparse,activeElement:BODY,willfocusiframe,didfocusiframe,activeElement:IFRAME,willbluriframe,didbluriframe,activeElement:BODY,willspineventloop,", 'Check log'); + }, "Check result"); + w.close(); + done(); +}; +var w = window.open("support/activeelement-after-immediately-focusing-same-site-iframe-outer.html"); +</script> 
diff --git a/focus/support/activeelement-after-focusing-different-site-iframe-inner-contentwindow.html b/focus/support/activeelement-after-focusing-different-site-iframe-inner-contentwindow.html new file mode 100644 index 0000000..bc78e6e --- /dev/null +++ b/focus/support/activeelement-after-focusing-different-site-iframe-inner-contentwindow.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Inner document</title> +</head> +<body> +<h1>Inner</h1> +<script> +document.body.onfocus = function() { + parent.postMessage("innerbodyfocus,", "*"); +} +document.body.onblur = function() { + parent.postMessage("innerbodyblur,", "*"); +} +</script> +</body> +</html> 
diff --git a/focus/support/activeelement-after-focusing-different-site-iframe-inner.html b/focus/support/activeelement-after-focusing-different-site-iframe-inner.html new file mode 100644 index 0000000..bc78e6e --- /dev/null +++ b/focus/support/activeelement-after-focusing-different-site-iframe-inner.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Inner document</title> +</head> +<body> +<h1>Inner</h1> +<script> +document.body.onfocus = function() { + parent.postMessage("innerbodyfocus,", "*"); +} +document.body.onblur = function() { + parent.postMessage("innerbodyblur,", "*"); +} +</script> +</body> +</html> 
diff --git a/focus/support/activeelement-after-focusing-different-site-iframe-outer-contentwindow.sub.html b/focus/support/activeelement-after-focusing-different-site-iframe-outer-contentwindow.sub.html new file mode 100644 index 0000000..fd66cba --- /dev/null +++ b/focus/support/activeelement-after-focusing-different-site-iframe-outer-contentwindow.sub.html 
@@ -0,0 +1,29 @@ +<!doctype html> +<meta charset="utf-8"> +<title>activeElement when focusing different-site iframe's contenWindow</title> +<script> +let log = ""; +function getLog() { + return log; +} +window.onmessage = function(e) { + log += e.data; +}; +window.onload = function() { + log += "outeronload,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willfocusiframe,"; + document.getElementsByTagName("iframe")[0].contentWindow.focus(); + log += "didfocusiframe,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willbluriframe,"; + document.getElementsByTagName("iframe")[0].contentWindow.blur(); + log += "didbluriframe,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willspineventloop," + opener.step_timeout(function() { + opener.postMessage(getLog(), "*"); + }, 1500); +} +</script> +<iframe src="http://{{hosts[alt][www]}}:{{ports[http][0]}}/focus/support/activeelement-after-focusing-different-site-iframe-inner-contentwindow.html"></iframe> 
diff --git a/focus/support/activeelement-after-focusing-different-site-iframe-outer.sub.html b/focus/support/activeelement-after-focusing-different-site-iframe-outer.sub.html new file mode 100644 index 0000000..bcbedb2 --- /dev/null +++ b/focus/support/activeelement-after-focusing-different-site-iframe-outer.sub.html 
@@ -0,0 +1,29 @@ +<!doctype html> +<meta charset="utf-8"> +<title>activeElement when focusing different-site iframe</title> +<script> +let log = ""; +function getLog() { + return log; +} +window.onmessage = function(e) { + log += e.data; +}; +window.onload = function() { + log += "outeronload,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willfocusiframe,"; + document.getElementsByTagName("iframe")[0].focus(); + log += "didfocusiframe,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willbluriframe,"; + document.getElementsByTagName("iframe")[0].blur(); + log += "didbluriframe,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willspineventloop," + opener.step_timeout(function() { + opener.postMessage(getLog(), "*"); + }, 1500); +} +</script> +<iframe src="http://{{hosts[alt][www]}}:{{ports[http][0]}}/focus/support/activeelement-after-focusing-different-site-iframe-inner.html"></iframe> 
diff --git a/focus/support/activeelement-after-focusing-same-site-iframe-inner-contentwindow.html b/focus/support/activeelement-after-focusing-same-site-iframe-inner-contentwindow.html new file mode 100644 index 0000000..bc78e6e --- /dev/null +++ b/focus/support/activeelement-after-focusing-same-site-iframe-inner-contentwindow.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Inner document</title> +</head> +<body> +<h1>Inner</h1> +<script> +document.body.onfocus = function() { + parent.postMessage("innerbodyfocus,", "*"); +} +document.body.onblur = function() { + parent.postMessage("innerbodyblur,", "*"); +} +</script> +</body> +</html> 
diff --git a/focus/support/activeelement-after-focusing-same-site-iframe-inner.html b/focus/support/activeelement-after-focusing-same-site-iframe-inner.html new file mode 100644 index 0000000..bc78e6e --- /dev/null +++ b/focus/support/activeelement-after-focusing-same-site-iframe-inner.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Inner document</title> +</head> +<body> +<h1>Inner</h1> +<script> +document.body.onfocus = function() { + parent.postMessage("innerbodyfocus,", "*"); +} +document.body.onblur = function() { + parent.postMessage("innerbodyblur,", "*"); +} +</script> +</body> +</html> 
diff --git a/focus/support/activeelement-after-focusing-same-site-iframe-outer-contentwindow.html b/focus/support/activeelement-after-focusing-same-site-iframe-outer-contentwindow.html new file mode 100644 index 0000000..63e2ac6 --- /dev/null +++ b/focus/support/activeelement-after-focusing-same-site-iframe-outer-contentwindow.html 
@@ -0,0 +1,29 @@ +<!doctype html> +<meta charset="utf-8"> +<title>activeElement when focusing same-site iframe's contentWindow</title> +<script> +let log = ""; +function getLog() { + return log; +} +window.onmessage = function(e) { + log += e.data; +}; +window.onload = function() { + log += "outeronload,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willfocusiframe,"; + document.getElementsByTagName("iframe")[0].contentWindow.focus(); + log += "didfocusiframe,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willbluriframe,"; + document.getElementsByTagName("iframe")[0].contentWindow.blur(); + log += "didbluriframe,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willspineventloop," + opener.step_timeout(function() { + opener.postMessage(getLog(), "*"); + }, 1500); +} +</script> +<iframe src="activeelement-after-focusing-same-site-iframe-inner-contentwindow.html"></iframe> 
diff --git a/focus/support/activeelement-after-focusing-same-site-iframe-outer.html b/focus/support/activeelement-after-focusing-same-site-iframe-outer.html new file mode 100644 index 0000000..333b436 --- /dev/null +++ b/focus/support/activeelement-after-focusing-same-site-iframe-outer.html 
@@ -0,0 +1,29 @@ +<!doctype html> +<meta charset="utf-8"> +<title>activeElement when focusing same-site iframe</title> +<script> +let log = ""; +function getLog() { + return log; +} +window.onmessage = function(e) { + log += e.data; +}; +window.onload = function() { + log += "outeronload,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willfocusiframe,"; + document.getElementsByTagName("iframe")[0].focus(); + log += "didfocusiframe,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willbluriframe,"; + document.getElementsByTagName("iframe")[0].blur(); + log += "didbluriframe,"; + log += "activeElement:" + document.activeElement.tagName + ","; + log += "willspineventloop," + opener.step_timeout(function() { + opener.postMessage(getLog(), "*"); + }, 1500); +} +</script> +<iframe src="activeelement-after-focusing-same-site-iframe-inner.html"></iframe> 
diff --git a/focus/support/activeelement-after-immediately-focusing-different-site-iframe-inner-contentwindow.html b/focus/support/activeelement-after-immediately-focusing-different-site-iframe-inner-contentwindow.html new file mode 100644 index 0000000..bc78e6e --- /dev/null +++ b/focus/support/activeelement-after-immediately-focusing-different-site-iframe-inner-contentwindow.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Inner document</title> +</head> +<body> +<h1>Inner</h1> +<script> +document.body.onfocus = function() { + parent.postMessage("innerbodyfocus,", "*"); +} +document.body.onblur = function() { + parent.postMessage("innerbodyblur,", "*"); +} +</script> +</body> +</html> 
diff --git a/focus/support/activeelement-after-immediately-focusing-different-site-iframe-inner.html b/focus/support/activeelement-after-immediately-focusing-different-site-iframe-inner.html new file mode 100644 index 0000000..bc78e6e --- /dev/null +++ b/focus/support/activeelement-after-immediately-focusing-different-site-iframe-inner.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Inner document</title> +</head> +<body> +<h1>Inner</h1> +<script> +document.body.onfocus = function() { + parent.postMessage("innerbodyfocus,", "*"); +} +document.body.onblur = function() { + parent.postMessage("innerbodyblur,", "*"); +} +</script> +</body> +</html> 
diff --git a/focus/support/activeelement-after-immediately-focusing-different-site-iframe-outer-contentwindow.sub.html b/focus/support/activeelement-after-immediately-focusing-different-site-iframe-outer-contentwindow.sub.html new file mode 100644 index 0000000..1024050 --- /dev/null +++ b/focus/support/activeelement-after-immediately-focusing-different-site-iframe-outer-contentwindow.sub.html 
@@ -0,0 +1,29 @@ +<!doctype html> +<meta charset="utf-8"> +<title>activeElement when immediately focusing different-site iframe's contentWindow</title> +<script> +let log = ""; +function getLog() { + return log; +} +window.onmessage = function(e) { + log += e.data; +}; +</script> +<iframe src="http://{{hosts[alt][www]}}:{{ports[http][0]}}/focus/support/activeelement-after-immediately-focusing-different-site-iframe-inner-contentwindow.html"></iframe> +<script> +log += "outerparser,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willfocusiframe,"; +document.getElementsByTagName("iframe")[0].contentWindow.focus(); +log += "didfocusiframe,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willbluriframe,"; +document.getElementsByTagName("iframe")[0].contentWindow.blur(); +log += "didbluriframe,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willspineventloop," +opener.step_timeout(function() { + opener.postMessage(getLog(), "*"); +}, 1500); +</script> 
diff --git a/focus/support/activeelement-after-immediately-focusing-different-site-iframe-outer.sub.html b/focus/support/activeelement-after-immediately-focusing-different-site-iframe-outer.sub.html new file mode 100644 index 0000000..3485f1b --- /dev/null +++ b/focus/support/activeelement-after-immediately-focusing-different-site-iframe-outer.sub.html 
@@ -0,0 +1,29 @@ +<!doctype html> +<meta charset="utf-8"> +<title>activeElement when immediately focusing different-site iframe</title> +<script> +let log = ""; +function getLog() { + return log; +} +window.onmessage = function(e) { + log += e.data; +}; +</script> +<iframe src="http://{{hosts[alt][www]}}:{{ports[http][0]}}/focus/support/activeelement-after-immediately-focusing-different-site-iframe-inner.html"></iframe> +<script> +log += "outerparser,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willfocusiframe,"; +document.getElementsByTagName("iframe")[0].focus(); +log += "didfocusiframe,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willbluriframe,"; +document.getElementsByTagName("iframe")[0].blur(); +log += "didbluriframe,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willspineventloop," +opener.step_timeout(function() { + opener.postMessage(getLog(), "*"); +}, 1500); +</script> 
diff --git a/focus/support/activeelement-after-immediately-focusing-same-site-iframe-inner-contentwindow.html b/focus/support/activeelement-after-immediately-focusing-same-site-iframe-inner-contentwindow.html new file mode 100644 index 0000000..bc78e6e --- /dev/null +++ b/focus/support/activeelement-after-immediately-focusing-same-site-iframe-inner-contentwindow.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Inner document</title> +</head> +<body> +<h1>Inner</h1> +<script> +document.body.onfocus = function() { + parent.postMessage("innerbodyfocus,", "*"); +} +document.body.onblur = function() { + parent.postMessage("innerbodyblur,", "*"); +} +</script> +</body> +</html> 
diff --git a/focus/support/activeelement-after-immediately-focusing-same-site-iframe-inner.html b/focus/support/activeelement-after-immediately-focusing-same-site-iframe-inner.html new file mode 100644 index 0000000..bc78e6e --- /dev/null +++ b/focus/support/activeelement-after-immediately-focusing-same-site-iframe-inner.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Inner document</title> +</head> +<body> +<h1>Inner</h1> +<script> +document.body.onfocus = function() { + parent.postMessage("innerbodyfocus,", "*"); +} +document.body.onblur = function() { + parent.postMessage("innerbodyblur,", "*"); +} +</script> +</body> +</html> 
diff --git a/focus/support/activeelement-after-immediately-focusing-same-site-iframe-outer-contentwindow.html b/focus/support/activeelement-after-immediately-focusing-same-site-iframe-outer-contentwindow.html new file mode 100644 index 0000000..3849f6e --- /dev/null +++ b/focus/support/activeelement-after-immediately-focusing-same-site-iframe-outer-contentwindow.html 
@@ -0,0 +1,29 @@ +<!doctype html> +<meta charset="utf-8"> +<title>activeElement when focusing same-site iframe's contentWindow</title> +<script> +let log = ""; +function getLog() { + return log; +} +window.onmessage = function(e) { + log += e.data; +}; +</script> +<iframe src="activeelement-after-immediately-focusing-same-site-iframe-inner-contentwindow.html"></iframe> +<script> +log += "outerparse,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willfocusiframe,"; +document.getElementsByTagName("iframe")[0].contentWindow.focus(); +log += "didfocusiframe,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willbluriframe,"; +document.getElementsByTagName("iframe")[0].contentWindow.blur(); +log += "didbluriframe,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willspineventloop," +opener.step_timeout(function() { + opener.postMessage(getLog(), "*"); +}, 1500); +</script> 
diff --git a/focus/support/activeelement-after-immediately-focusing-same-site-iframe-outer-contenwindow.html b/focus/support/activeelement-after-immediately-focusing-same-site-iframe-outer-contenwindow.html new file mode 100644 index 0000000..bafc260 --- /dev/null +++ b/focus/support/activeelement-after-immediately-focusing-same-site-iframe-outer-contenwindow.html 
@@ -0,0 +1,29 @@ +<!doctype html> +<meta charset="utf-8"> +<title>activeElement when focusing same-site iframe's contentWindow</title> +<script> +let log = ""; +function getLog() { + return log; +} +window.onmessage = function(e) { + log += e.data; +}; +</script> +<iframe src="activeelement-after-immediately-focusing-same-site-iframe-inner-contentwindow.html"></iframe> +<script> +log += "outerparse,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willfocusiframe,"; +document.getElementsByTagName("iframe")[0].focus(); +log += "didfocusiframe,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willbluriframe,"; +document.getElementsByTagName("iframe")[0].blur(); +log += "didbluriframe,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willspineventloop," +opener.step_timeout(function() { + opener.postMessage(getLog(), "*"); +}, 1500); +</script> 
diff --git a/focus/support/activeelement-after-immediately-focusing-same-site-iframe-outer.html b/focus/support/activeelement-after-immediately-focusing-same-site-iframe-outer.html new file mode 100644 index 0000000..f22fa98 --- /dev/null +++ b/focus/support/activeelement-after-immediately-focusing-same-site-iframe-outer.html 
@@ -0,0 +1,29 @@ +<!doctype html> +<meta charset="utf-8"> +<title>activeElement when focusing same-site iframe</title> +<script> +let log = ""; +function getLog() { + return log; +} +window.onmessage = function(e) { + log += e.data; +}; +</script> +<iframe src="activeelement-after-immediately-focusing-same-site-iframe-inner.html"></iframe> +<script> +log += "outerparse,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willfocusiframe,"; +document.getElementsByTagName("iframe")[0].focus(); +log += "didfocusiframe,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willbluriframe,"; +document.getElementsByTagName("iframe")[0].blur(); +log += "didbluriframe,"; +log += "activeElement:" + document.activeElement.tagName + ","; +log += "willspineventloop," +opener.step_timeout(function() { + opener.postMessage(getLog(), "*"); +}, 1500); +</script> 
diff --git a/focus/support/focus-restoration-in-different-site-iframes-outer.sub.html b/focus/support/focus-restoration-in-different-site-iframes-outer.sub.html index 91ffed1..ecc1af2 100644 --- a/focus/support/focus-restoration-in-different-site-iframes-outer.sub.html +++ b/focus/support/focus-restoration-in-different-site-iframes-outer.sub.html 
@@ -12,11 +12,11 @@  other = window.open("focus-restoration-in-different-site-iframes-other.html", "otherwindow", "resizable=yes");  } else if (e.data == "other") {  other.close(); - setTimeout(function() { + opener.step_timeout(function() {  document.getElementsByTagName("iframe")[0].contentWindow.postMessage("getlog", "*");  }, 2000);  } else { - setTimeout(function() { + opener.step_timeout(function() {  opener.postMessage(getLog() + e.data, "*");  }, 1000);  }